package com.cskaoyan.day2.collection._02_iteraror;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 有几种方法删除所有的张三:
 * 1.removeAll()
 * 2.使用一个count，存储有多少个 张三；
 * 再删除多少次。
 * 3.使用迭代器，合适的时候 remove。
 *
 * @author Common-zhou
 * @since 2023-02-28 14:46
 */
public class Demo2 {
    public static void main(String[] args) {
        //testIterator();

        //testIteratorRemove();

        //testIteratorRemove2();

        //testIteratorRemove3();

        //testIteratorRemove4();

        testIteratorRemove5();

        testIteratorRemove6();

    }

    private static void testIteratorRemove6() {
        Collection<String> collection = new ArrayList<>();
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        collection.add("张三");
        collection.add("王五");
        collection.add("张三");

        Iterator<String> iterator = collection.iterator();
        Collection<String> collection1 = new ArrayList<>();

        while (iterator.hasNext()) {
            String next = iterator.next();
            if ("张三".equals(next)) {
                collection1.add(next);
            }
        }

        Iterator<String> iterator1 = collection1.iterator();
        while (iterator1.hasNext()) {
            String next = iterator1.next();
            collection.remove(next);
        }

        System.out.println(collection);


    }

    private static void testIteratorRemove5() {
        Collection<String> collection = new ArrayList<>();
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");

        Iterator<String> iterator = collection.iterator();


        //     李四   王五
        //    |

        // 并发修改异常： 我们在使用迭代器的时候，对原有集合进行了操作。（结构化改变 添加 删除）
        // 这时候再去使用迭代器，会报并发修改异常。
        // 1. 要么使用迭代器的时候，不要去修改原有集合的结构。
        //   如果说，必须想修改原有集合的结构。那么可以使用集合，把数据先存下来。等迭代器使用完成，再去删除

        //while (iterator.hasNext()) {
        //    String next = iterator.next();
        //    System.out.println(next);
        //    if ("张三".equals(next)) {
        //        collection.remove("张三");
        //    }
        //}

    }

    private static void testIteratorRemove4() {
        Collection<String> collection = new ArrayList<>();
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        collection.add("张三");
        collection.add("王五");
        collection.add("张三");

        Iterator<String> iterator = collection.iterator();

        while (iterator.hasNext()) {
            String next = iterator.next();
            if ("张三".equals(next)) {
                iterator.remove();
            }
        }

        System.out.println(collection);
    }

    private static void testIteratorRemove3() {
        Collection<String> collection = new ArrayList<>();
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        collection.add("张三");
        collection.add("王五");
        collection.add("张三");
        collection.add(null);

        //collection.remove("张三");
        //collection.remove("张三");

        Iterator<String> iterator = collection.iterator();
        int count = 0;

        while (iterator.hasNext()) {
            String next = iterator.next();
            //if (next.equals("张三")) {
            if ("张三".equals(next)) {
                // 记录有几个张三
                count++;
            }
        }

        // 实际去删除张三的次数
        for (int i = 0; i < count; i++) {
            collection.remove("张三");
        }

        System.out.println(collection);

    }

    /**
     * Collection<String>
     * 想删除所有的张三
     */
    private static void testIteratorRemove2() {

        Collection<String> collection = new ArrayList<>();
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        collection.add("张三");
        collection.add("王五");


        Collection<String> collection1 = new ArrayList<>();
        collection1.add("张三");

        collection.removeAll(collection1);
        System.out.println(collection);


    }

    private static void testIteratorRemove() {
        // 删除元素
        //    boolean hasNext(): 是否有下一个元素
        //    E next()： 获取下一个元素
        //    void remove()： 删除刚刚遍历过的元素
        Collection<String> collection = new ArrayList<>();
        collection.add("zs");
        collection.add("ls");
        collection.add("wu");

        Iterator<String> iterator = collection.iterator();

        // 如果迭代器没有使用，直接调用remove方法 会报错
        //iterator.remove();

        // 这只是检查  hasNext
        //boolean hasNext = iterator.hasNext();

        //    zs    ls     wu
        //             |

        //String next = iterator.next();
        //System.out.println(next);
        //iterator.remove();

        //System.out.println(collection);


        //    zs    ls     wu
        //              |
        String next = iterator.next();
        String next1 = iterator.next();
        System.out.println(next);
        System.out.println(next1);

        // 需要注意，不能连续调用两次删除
        iterator.remove();
        //iterator.remove();
        System.out.println(collection);


    }

    private static void testIterator() {
        Collection<String> collection = new ArrayList<>();
        collection.add("zs");
        collection.add("ls");
        collection.add("wu");
        collection.add("zl");
        collection.add("Java");

        Iterator<String> iterator = collection.iterator();

        //System.out.println(iterator.hasNext());
        //System.out.println(iterator.next());

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


    }
}
